package xgodbconfig

import (
	"encoding/json"
	"time"

	"gitee.com/xiaoyutab/xgotool/xerror"
)

// 设置int类型配置
//
//	name	配置项的名称
//	val		配置项的值
func SetInt(name string, val int64) error {
	conf := Getconfigure(name)
	conf.ValueInt = val
	conf.Types = "int"
	return setconfigure(conf)
}

// 设置string类型配置
//
//	name	配置项的名称
//	val		配置项的值
func SetString(name, val string) error {
	conf := Getconfigure(name)
	conf.ValueString = val
	conf.Types = "string"
	return setconfigure(conf)
}

// 设置float类型配置
//
//	name	配置项的名称
//	val		配置项的值
func SetFloat(name string, val float64) error {
	conf := Getconfigure(name)
	conf.ValueFloat = val
	conf.Types = "float"
	return setconfigure(conf)
}

// 设置bool类型配置
//
//	name	配置项的名称
//	val		配置项的值
func SetBool(name string, val bool) error {
	conf := Getconfigure(name)
	if val {
		conf.ValueBool = 1
	} else {
		conf.ValueBool = 0
	}
	conf.Types = "bool"
	return setconfigure(conf)
}

// 设置select类型配置
// 下拉列表，多项使用,分割key和key_cn使用:分割
//
//	name	配置项的名称
//	val		配置项的值
func SetSelect(name, val string) error {
	conf := Getconfigure(name)
	conf.ValueString = val
	conf.Types = "select"
	return setconfigure(conf)
}

// 设置text类型配置
// 下拉列表，多项使用,分割key和key_cn使用:分割
//
//	name	配置项的名称
//	val		配置项的值
func SetText(name, val string) error {
	conf := Getconfigure(name)
	conf.ValueString = val
	conf.Types = "text"
	return setconfigure(conf)
}

// 设置longtext类型配置
// 下拉列表，多项使用,分割key和key_cn使用:分割
//
//	name	配置项的名称
//	val		配置项的值
func SetLongText(name, val string) error {
	conf := Getconfigure(name)
	conf.ValueString = val
	conf.Types = "longtext"
	return setconfigure(conf)
}

// 设置配置项
func setconfigure(conf Configure) error {
	// 如果配置项为空，则直接返回成功
	if conf.NameKey == "" {
		return nil
	}
	if conf.Id <= 0 {
		return xerror.New("配置项【" + conf.NameKey + "】不存在")
	}
	conf.UpdatedAt = time.Now().Format(time.DateTime)
	err := _default.DB.Table("configure").Where("name_key", conf.NameKey).Save(&conf).Error
	if err != nil {
		return err
	}
	// 修改缓存
	_default.Lock.Lock()
	_default.Cache[conf.NameKey] = conf
	_default.Lock.Unlock()
	// 配置项变更后的改动回调
	configEdit(conf.NameKey)
	return nil
}

// 设置配置项(批量插入)，若存在则跳过该配置项
//
//	confs	待插入的配置项列表
func InsertsOrContinue(confs []Configure) error {
	for i := 0; i < len(confs); i++ {
		conf := confs[i]
		tmp := Getconfigure(conf.NameKey)
		if tmp.Id > 0 {
			continue
		}
		// 如果配置项为空，则直接返回成功
		if conf.NameKey == "" {
			return nil
		}
		conf.CreatedAt = time.Now().Format(time.DateTime)
		conf.UpdatedAt = time.Now().Format(time.DateTime)
		err := _default.DB.Table("configure").Where("name_key", conf.NameKey).Save(&conf).Error
		if err != nil {
			return err
		}
		// 修改缓存
		_default.Lock.Lock()
		_default.Cache[conf.NameKey] = conf
		_default.Lock.Unlock()
	}
	return nil
}

// 写入个人配置项
//
//	uid		用户ID
//	conf	配置项（采用json读取的方式进行反向解析，所以此处请使用指针进行获取）
func SetUserConfigure(uid uint, conf any) error {
	conf_user, err := json.Marshal(conf)
	if err != nil {
		return err
	}
	// 写入cache缓存
	_default.Lock.Lock()
	defer _default.Lock.Unlock()
	_default.CacheUser[uid] = string(conf_user)
	// 写入数据库
	err = _default.DB.Table(_default.ConfigUserTable).Where("user_id", uid).Save(&ConfigureUser{
		UserId:    uid,
		Configure: string(conf_user),
	}).Error
	if err != nil {
		return err
	}
	return nil
}
